/**
 * 公共JS   此文件不允许改动，若有改动，联系李剑|18363003321
 * lijian
 * 每个前端，直接复制使用
 */
import Vue from 'vue'
import CryptoJS from 'crypto-js'
import tools from './tools'
import { Message } from 'element-ui'

var common = {
  /**
   * 每页默认显示20条数据
   */
  PAGE_LIMIT_DEFAULT: 20,
  /**
   * 默认排序
   */
  SORT_DEFAULT: '-gmtModified',

  /**
   * 加密
   * @param {*} word
   * @param {*} keyStr
   */
  encrypt(word, keyStr) {
    keyStr = keyStr || 'abcdefgabcdefg12'
    var key = CryptoJS.enc.Utf8.parse(keyStr)// Latin1 w8m31+Yy/Nw6thPsMpO5fg==
    var srcs = CryptoJS.enc.Utf8.parse(word)
    var encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 })
    return encrypted.toString()
  },
  /**
   * 解密
   * @param {*} word
   * @param {*} keyStr
   */
  decrypt(word, keyStr) {
    keyStr = keyStr || 'abcdefgabcdefg12'
    var key = CryptoJS.enc.Utf8.parse(keyStr)// Latin1 w8m31+Yy/Nw6thPsMpO5fg==
    var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 })
    return CryptoJS.enc.Utf8.stringify(decrypt).toString()
  },
  /**
   * 生成文字图片
   * @param {*} name
   * @returns
   */
  generateTextPictures(title = '未?') {
    var colors = ['#D891FF', '#79ACFF', '#5CD4D2', '#63D19F', '#FF9E48', '#FF8A73', '#A1D759', '#61C9E7', '#008CDB', '#E1D7FA']
    const num = parseInt(Math.random() * 100)
    const index = num % colors.length
    const bg = colors[index]
    const w = 96
    const h = 96

    const can = document.createElement('canvas')
    can.width = w
    can.height = h
    const _ctxt = can.getContext('2d')
    _ctxt.fillStyle = bg
    _ctxt.fillRect(0, 0, w, h)
    _ctxt.font = `bold ${title.length === 2 ? (w / 2 - 10) : (w / 2 - 5)}px 苹方`
    _ctxt.fillStyle = '#effaf8'
    _ctxt.textAlign = 'center'
    _ctxt.textBaseline = 'middle'
    _ctxt.fillText(title, w / 2, h / 2)
    return can.toDataURL()
  },
  /**
   * 检查浏览器
   */
  checkBrower() {
    const userAgent = navigator.userAgent
    var isLessIE11 = userAgent.indexOf('compatible') > -1 && userAgent.indexOf('MSIE') > -1
    if (isLessIE11) {
      var str = '你的浏览器版本太low了,已经和时代脱轨了 :('
      var str2 =
                "推荐使用:<a href='http://dcbrowser.sjkj777.cn/' target='_blank' style='color:blue;'>谷歌</a>," +
                "<a href='http://www.firefox.com.cn/' target='_blank' style='color:blue;'>火狐</a>," +
                "<a href='https://browser.360.cn/' target='_blank' style='color:blue;'>360浏览器</a>," +
                '其他双核极速模式'
      document.writeln(
        "<pre style='text-align:center;color:#fff;background-color:#0cc; height:100%;border:0;position:fixed;top:0;left:0;width:100%;z-index:1234'>" +
                    "<h2 style='padding-top:200px;margin:0'><strong>" +
                    str +
                    '<br/></strong></h2><h2>' +
                    str2 +
                    "</h2><h2 style='margin:0'><strong>如果你的使用的是双核浏览器,请切换到极速模式访问<br/></strong></h2></pre>"
      )
      document.execCommand('Stop')
    }
  },

  /**
   * 格式化地区
   * @param {*} d 地区格式为：ID:省;ID:市;ID:县/区;ID:街道  或  ID:省;ID:市;ID:县/区
   */
  regionFormat(d) {
    if (d) {
      if (d.split(';').length === 5) {
        const regions = d.split(';')
        return regions[0].split(':')[1].replace('-1', '') +
                   regions[1].split(':')[1].replace('-1', '') +
                   regions[2].split(':')[1].replace('-1', '') +
                   regions[3].split(':')[1].replace('-1', '') +
                   regions[4].split(':')[1].replace('-1', '')
      } else if (d.split(';').length === 4) {
        const regions = d.split(';')
        return regions[0].split(':')[1].replace('-1', '') +
                   regions[1].split(':')[1].replace('-1', '') +
                   regions[2].split(':')[1].replace('-1', '') +
                   regions[3].split(':')[1].replace('-1', '')
      } else if (d.split(';').length === 3) {
        const regions = d.split(';')
        return regions[0].split(':')[1].replace('-1', '') +
                   regions[1].split(':')[1].replace('-1', '') +
                   regions[2].split(':')[1].replace('-1', '')
      } else {
        return '地址格式错误'
      }
    } else {
      return '暂无地址'
    }
  },
  /**
   * 获取地区key值
   * @param {*} d 地区格式为：ID:省;ID:市;ID:县/区;ID:街道  或  ID:省;ID:市;ID:县/区
   */
  regionIdFormat(d) {
    if (d) {
      if (d.split(';').length === 5) {
        const regions = d.split(';')
        return {
          province: regions[0].split(':')[0].replace('-1', '0'),
          city: regions[1].split(':')[0].replace('-1', '0'),
          area: regions[2].split(':')[0].replace('-1', '0'),
          street: regions[3].split(':')[0].replace('-1', '0'),
          address: regions[4].split(':')[1].replace('-1', '0')
        }
      } else if (d.split(';').length === 4) {
        const regions = d.split(';')
        return {
          province: regions[0].split(':')[0].replace('-1', '0'),
          city: regions[1].split(':')[0].replace('-1', '0'),
          area: regions[2].split(':')[0].replace('-1', '0'),
          street: regions[3].split(':')[0].replace('-1', '0')
        }
      } else if (d.split(';').length === 3) {
        const regions = d.split(';')
        return {
          province: regions[0].split(':')[0].replace('-1', '0'),
          city: regions[1].split(':')[0].replace('-1', '0'),
          area: regions[2].split(':')[0].replace('-1', '0')
        }
      } else {
        return '地址格式错误'
      }
    } else {
      return '-'
    }
  },
  /**
   * 格式化数据字典组
   * @param {*} d
   */
  dataDictFormat(d) {
    if (d) {
      const datas = d.split(':')
      if (d.split(':').length === 3) {
        return {
          typeCode: datas[0],
          typeName: datas[1],
          colorValue: datas[2]
        }
      } else if (d.split(':').length === 2) {
        return {
          typeCode: datas[0],
          typeName: datas[1],
          colorValue: ''
        }
      } else {
        return d
      }
    } else {
      return '-'
    }
  },
  /**
   * 简单实现防抖方法
   *
   * 防抖(debounce)函数在第一次触发给定的函数时，不立即执行函数，而是给出一个期限值(delay)，比如100ms。
   * 如果100ms内再次执行函数，就重新开始计时，直到计时结束后再真正执行函数。
   * 这样做的好处是如果短时间内大量触发同一事件，只会执行一次函数。
   *
   * @param fn 要防抖的函数
   * @param delay 防抖的毫秒数
   * @returns {Function}
 */
  simpleDebounce: function(fn, delay = 100) {
    let timer = null
    return function() {
      const args = arguments
      if (timer) {
        clearTimeout(timer)
      }
      timer = setTimeout(() => {
        fn.apply(this, args)
      }, delay)
    }
  },
  /**
   * 二维码加密
   * @param {*} type
   * @param {*} code
   * @param {*} name
   * @param {*} expiryTime
   */
  encryptionQrcode: function(type, code, name, expiryTime = -1) {
    var qrcodeJSON = {
      type: type,
      code: code,
      name: name,
      expiryTime: expiryTime
    }
    var result = this.encrypt(JSON.stringify(qrcodeJSON))
    return result
  },
  /**
   * 二维码解密
   * @param {*} data
   */
  decryptQrcode: function(data) {
    try {
      var result = JSON.parse(this.decrypt(data))
      if (result.expiryTime === -1) {
        return result
      } else if (result.expiryTime > new Date().getTime()) {
        return result
      } else {
        Message({
          message: '二维码已失效',
          type: 'warning',
          duration: 2 * 1000
        })
        return null
      }
    } catch (err) {
      Message({
        message: '二维码解析错误!',
        type: 'warning',
        duration: 2 * 1000
      })
      return null
    }
  },
  /**
   * 获取当前路径
   * @returns
   */
  getUrl() {
    return window.location.protocol + '//' + window.location.host + window.location.pathname
  },
  isExternal: function(path) {
    return /^(https?:|mailto:|tel:)/.test(path)
  },
  /**
   * 验证是否含有数字
   * @param {*} $value
  */
  _hasNumber($value) {
    let $bool = false
    const $Letters = '1234567890'
    for (let $i = 0; $i < $value.length; $i++) {
      const $c = $value.charAt($i)
      if ($Letters.indexOf($c) !== -1) {
        $bool = true
        break
      }
    }
    return $bool
  },
  /**
   * 验证是否含有小写字母
   * @param {*} $value
  */
  _hasSmallChar($value) {
    let $bool = false
    const $Letters = 'abcdefghijklnmopqrstuvwxyz'
    for (let $i = 0; $i < $value.length; $i++) {
      const $c = $value.charAt($i)
      if ($Letters.indexOf($c) !== -1) {
        $bool = true
        break
      }
    }
    return $bool
  },
  /**
   * 验证码是否含有大写字母
   * @param {*} $value
  */
  _hasBigChar($value) {
    let $bool = false
    const $Letters = 'ABCDEFGHIJKLNMOPQRSTUVWXYZ'
    for (let $i = 0; $i < $value.length; $i++) {
      const $c = $value.charAt($i)
      if ($Letters.indexOf($c) !== -1) {
        $bool = true
        break
      }
    }
    return $bool
  },
  /**
   * 根据身份证号返回性别、年龄、出生日期
   * @param {*} userCard
  */
  analyzeIDCard(userCard) {
    // 先验证身份证号是否合法
    if (tools.isCardID(userCard)) {
      const obj = {}
      // 获取性别
      if (parseInt(userCard.substr(16, 1)) % 2 === 1) {
        obj.sex = 1
      } else {
        obj.sex = 2
      }
      // 获取出生年月日
      var yearBirth = userCard.substring(6, 10)
      var monthBirth = userCard.substring(10, 12)
      var dayBirth = userCard.substring(12, 14)
      // 获得时间戳
      var date = yearBirth + '/' + monthBirth + '/' + dayBirth
      var timestamp = new Date(date).getTime()
      obj.birthday = timestamp
      // 获取当前年月日并计算年龄
      var myDate = new Date()
      var monthNow = myDate.getMonth() + 1
      var dayNow = myDate.getDay()
      var age = myDate.getFullYear() - yearBirth
      if (monthNow < monthBirth || (monthNow === monthBirth && dayNow < dayBirth)) {
        age--
      }
      // 得到年龄
      obj.age = age
      return obj
    }
    return null
  },
  /**
   * @param {HTMLElement} element
   * @param {string} className
  */
  toggleClass(element, className) {
    if (!element || !className) {
      return
    }
    let classString = element.className
    const nameIndex = classString.indexOf(className)
    if (nameIndex === -1) {
      classString += '' + className
    } else {
      classString =
      classString.substr(0, nameIndex) +
      classString.substr(nameIndex + className.length)
    }
    element.className = classString
  }
}

Vue.prototype.common = common
export default common
